/**
 * Copyright &copy; 2019-2022 <a href="https://gitee.com/rit/zx-pm">zx-pm</a> All rights reserved.
 */
package com.zx.pm.modules.zx.service;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.zx.pm.common.persistence.Page;
import com.zx.pm.common.service.CrudService;
import com.zx.pm.common.utils.IdGen;
import com.zx.pm.common.utils.StringUtils;
import com.zx.pm.modules.zx.dao.LzdDao;
import com.zx.pm.modules.zx.dao.TenderSectionDao;
import com.zx.pm.modules.zx.dao.YwLogDao;
import com.zx.pm.modules.zx.entity.Lzd;
import com.zx.pm.modules.zx.entity.ProTimeNode;
import com.zx.pm.modules.zx.entity.TenderSection;
import com.zx.pm.modules.zx.entity.YwLog;

/**
 * 项目流转单Service
 * @author forest
 * @version 2019-01-06
 */
@Service
@Transactional(readOnly = true)
public class LzdService extends CrudService<LzdDao, Lzd> {

	@Autowired
	private YwLogDao ywLogDao;
	
	@Autowired
	private TenderSectionDao tenderSectionDao;
	
	public Lzd get(String id) {
		 
		return super.get(id);
	}
	
	public List<Lzd> findList(Lzd lzd) {
		return super.findList(lzd);
	}
	
	public Page<Lzd> findPage(Page<Lzd> page, Lzd lzd) {
		return super.findPage(page, lzd);
	}
	
	/**
	 * 获取带子标段的项目
	 * @param page
	 * @param entity
	 * @return
	 */
	public Page<Lzd> findSectionPage(Page<Lzd> page, Lzd entity) {
		entity.setPage(page);
		page.setList(dao.findSectionList(entity));
		return page;
	}
	
	@Transactional(readOnly = false)
	public void save(Lzd lzd) {
		// 保存业务操作日志
		YwLog yw = new YwLog();
		if ("1".equals(lzd.getOperateFalg())){ // 执行insert操作
			// 判断是否是重新开标
			Integer restartCount = 0;
			if(StringUtils.isNotBlank(lzd.getResetLzdId())) {
				// 获取重开次数
				restartCount = dao.getRestartCount(lzd);
			}
			// 项目分组Id
			// lzd.setProGroup(IdGen.uuid());
			// 判断是否有子标段,如果有则进行子标段插入
			if(lzd.getSectionList() != null && lzd.getSectionList().size() > 0 && "1".equals(lzd.getIsSubpackage())) {
				for(TenderSection e : lzd.getSectionList()) { // 批量插入项目
					e.setId(IdGen.uuid());
					e.setLzdId(lzd.getId());
					e.setCreateDate(new Date());
					if(StringUtils.isNotBlank(e.getSectionName())) {
						// 设置当前标段重开次数
						e.setRestartCount(restartCount + 2);
						tenderSectionDao.insert(e);
					}
				}
			}
			// 插入主项目
			// 设置当前项目信息重开的次数
			lzd.setRestartCount(restartCount + 2);
			dao.insert(lzd);
			yw.setType("1");
			
		}else{ // 执行update操作
			List<TenderSection> list = tenderSectionDao.getSectionListByLzdId(lzd.getId(), null);
			if(lzd.getSectionList() != null && lzd.getSectionList().size() > 0 && "1".equals(lzd.getIsSubpackage())) {
				if(list == null) { // 如果该项目下没有子标段，则该次全部插入
					for(TenderSection e : lzd.getSectionList()) { // 批量插入项目
						e.setId(IdGen.uuid());
						e.setLzdId(lzd.getId());
						e.setCreateDate(new Date());
						if(StringUtils.isNotBlank(e.getSectionName())) {
							tenderSectionDao.insert(e);
						}
					}
				}else {
					// 如果该项目下已存在子标段
					// 判断哪些子标段些需要需要更新，需要新增
					Map<String, Object> m = new HashMap<String, Object>();
					for(TenderSection e : lzd.getSectionList()) { // 批量插入项目
						if(StringUtils.isBlank(e.getId())) { // 如果子标段ID为空，则执行insert
							e.setId(IdGen.uuid());
							e.setLzdId(lzd.getId());
							e.setCreateDate(new Date());
							if(StringUtils.isNotBlank(e.getSectionName())) {
								tenderSectionDao.insert(e);
							}
						}else {
							tenderSectionDao.update(e);
							// 将这次更新的数据记录到map中,用于下一步判断
							m.put(e.getId(), e);
						}
					}
					// 判断需要删除的标段
					for(TenderSection e : list) {
						// 如果该条数据在map中找不到，则说明该数据需要被删除掉 
						if(m.get(e.getId()) == null) {
							tenderSectionDao.delById(e.getId());
						}
					}
				}
			}
			
			yw.setType("2");
			dao.update(lzd);
		}
		yw.preInsert();
		yw.setId(IdGen.uuid());
		yw.setDataId(lzd.getId());
		yw.setYwTable("zx_lzd");
		yw.setYwName("项目基本信息");
		yw.setRemoteAddr("0:0:0:0:0:0:0:1");
		ywLogDao.insert(yw);
	}
	
	@Transactional(readOnly = false)
	public void delete(Lzd lzd) {
		//保存业务操作日志
		YwLog yw = new YwLog();
		yw.preInsert();
		yw.setType("4");
		yw.setDataId(lzd.getId());
		yw.setYwTable("zx_lzd");
		yw.setYwName("项目基本信息");
		yw.setRemoteAddr("0:0:0:0:0:0:0:1");
		ywLogDao.insert(yw);
		super.delete(lzd);
	}
	
	public List<String> getBuyUnitList(){
		return dao.getBuyUnitList();
	}
	
	public Lzd getByBuyUnit(Lzd lzd) {
		return dao.getByBuyUnit(lzd);
	}
	
	public int updateLzdStaut(String lzdStatus, String lzdId) {
		return dao.updateLzdStaut(lzdStatus, lzdId);
	}
	
	public List<Lzd> getNotAuditLzd(){
		return dao.getNotAuditLzd();
	}
	
	public List<ProTimeNode> getBidSecurityDateLzd(){
		return dao.getBidSecurityDateLzd();
	}
	
	public List<ProTimeNode> getTenderSaleDateLzd(){
		return dao.getTenderSaleDateLzd();
	}
	
	public List<ProTimeNode> getTenderOpenDateLzd(){
		return dao.getTenderOpenDateLzd();
	}
	
	public Double getDepositMoney(String lzdId, String sectionId) {
		return dao.getDepositMoney(lzdId, sectionId);
	}
	
	public List<Lzd> getInvalidLzd(){
		return dao.getInvalidLzd();
	}
	
	public Integer getRestartCount(Lzd lzd) {
		return dao.getRestartCount(lzd);
	}
	
	public List<Lzd> getTimeLimitLzd(){
		return dao.getTimeLimitLzd();
	}
}